home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #5 & #6
/
Amiga Plus CD - 1995 - No. 5 and 6.iso
/
pd
/
serien
/
purity
/
nr.5
/
pascal
/
pcq-programme
/
dxboot
/
dxboot.p
< prev
next >
Wrap
Text File
|
1995-04-19
|
9KB
|
379 lines
Program DxBoot;
{$I "include:exec/Exec.i" }
{$I "include:exec/IO.i" }
{$I "include:Utils/IOUtils.i"}
{$I "include:libraries/dos.i"}
{$I "include:utils/stringlib.i"}
{$I "include:utils/parameters.i"}
CONST
CMD_MOTOR : Short = 9; { ist nicht in execIO.i def., }
CMD__Null : Short = 0;
CMD__Kill : Short = 1;
CMD__Read : Short = 2;
CMD__Write : Short = 3;
CMD__Chk : Short = 4;
CMD__Boot : Short = 5;
CMD__Cmp : Short = 6;
CMD__Type : Short = 7;
CMD__Help : Short = 8;
on = 1;
off = 0;
dev : String = "trackdisk.device";
ErrorTD_IO : String = " Error on trackdisk-IO\n";
DosErr_Rf : String = " Error reading file\n";
DosErr_Wf : String = " Error writing file\n";
Type
BB = Array[0..1023] Of Byte;
BBPtr = ^BB;
VAR
comm,
i : Short;
ok,
dfx : Integer;
ArgStr,
ExitStr : String;
Handle : FileHandle;
BB1,
BB2 : BBPtr;
{ --- Zum sauberen Verlassen des Programms, egal, von wo ! --- }
Procedure Cleanexit(why : String; RT : Integer);
Begin
IF handle <>NIL then DOSClose(handle); { --- File schließen --- }
IF BB1 <>NIL then FreeMem(BB1,1024); { --- ChipMem freigeben --- }
IF why<>NIL then begin
writeln(why);
If RT=5 then write("\nUsage : DxBoot cmd unit[0..3] <filename>\n",
"Type DxBoot ? for help\n\n");
Delay(100); { --- 2 s warten --- }
end;
Exit(RT);
End;
{ --- HexDump des BB`s ausgeben --- }
Procedure DumpBB;
Const
hex : ARRAY[0..15] OF Char = ('0123456789ABCDEF');
Var
BW : Byte;
k,j : Short;
Buf : String;
Begin
k:=0; { --- Setup --- }
Buf:=AllocString(70);
Buf[48]:=' '; { --- Leerzeichen --- }
Buf[49]:=' ';
Buf[66]:=chr(10); { --- Return & linefeed --- }
Buf[67]:=chr(0); { --- Abschlußbyte f. Strings = 0 --- }
For i:=1 to 64 Do BEGIN { --- 64 Zeile zu 16 Bytes --- }
For j:=0 to 15 Do Begin
BW:=BB1^[k];
Buf[j*3]:=' '; { --- Leerzeichen --- }
Buf[j*3+1]:=hex[BW DIV 16]; { --- Byte-hälfte high ---}
Buf[j*3+2]:=hex[BW MOD 16]; { --- Byte-hälfte low --- }
IF ((BW > 31) AND (BW < 123)) then
Buf[50+j]:=chr(BW)
ELSE { --- Ggf. (A..z) --- }
Buf[50+j]:='.'; { --- sonst . --- }
inc(k); { --- k um 1 erhöhen --- }
End;
write(Buf); { --- Zeile ausgeben --- }
End;
end;
Procedure Instant13BB(bbm : BBPtr); { --- Trägt in bbm^ einen 1.3-BB ein --- }
Const
BB13 : ARRAY[0..48] OF Byte = ( $44, $4F, $53, $00, $C0, $20, $0F, $19,
$00, $00, $03, $70, $43, $FA, $00, $18,
$4E, $AE, $FF, $A0, $4A, $80, $67, $0A,
$20, $40, $20, $68, $00, $16, $70, $00,
$4E, $75, $70, $FF, $60, $FA, $64, $6F,
$73, $2E, $6C, $69, $62, $72, $61, $72,
$79, );
Var
j : short;
Begin
for j:=0 to 48 do bbm^[j]:=BB13[j]; { --- 1.3-BB kopieren --- }
for j:=49 to 1023 do bbm^[j]:=0; { --- mit 0 auffüllen --- }
End;
{ --- Bootblock-Ein/Ausgabe --- }
Function RWBB(unit: Integer; cmd: Short; mem: Address):Boolean;
PROCEDURE Motor(iostdr:IOStdReqPtr; switch:Integer);
Var { dfx-Motor an/aus }
okm : Integer;
BEGIN
iostdr^.io_Command:=CMD_MOTOR; { Motor schalten }
iostdr^.io_Length:=switch; { on/off übergeben }
okm:=DoIO(iostdr); { GO ! }
END; { Motor }
Var
myReq : IOStdReqPtr;
myPort : MsgPortPtr;
myMem : Address;
Begin
myPort:=CreatePort(NIL,0); { Nachrichtenport des Laufwerks }
myReq:=CreateStdIO(myPort); { Kommunikationsport einrichten }
ok:=OpenDevice(dev,unit,myReq,0); { TrackDisk öffnen }
IF ok=0 THEN BEGIN
With myReq^ do begin
io_Data := mem; { Speicherbereich }
io_Offset := 0; { Offset = Block 0 }
io_Length := 1024; { 1024 bytes }
io_Command := CMD_CLEAR; { zuerst Trackbuffer löschen }
end;
ok:=DoIO(myReq);
If ok=0 then begin { wenn gelöscht, dann }
myReq^.io_command := cmd; { BB schreiben/lesen }
ok:=DoIO(myReq);
If (ok=0) AND (cmd =CMD__Write) then begin
myReq^.io_Command := CMD_UPDATE;
ok:=DoIO(myReq); { zum Schreiben "updaten" }
end; { d.h. Trackbuffer -> Disk }
end;
Motor(myReq,off); { Motor aus & fertig }
CloseDevice(myReq); { Device schließen }
DeleteStdIO(myReq); { IOReq entfernen }
DeletePort(myPort); { MsgPort entfernen }
If ok=0 then RWBB:=TRUE else RWBB:=False;
End Else RWBB:=FALSE;
End;
{ --- File-Ein/Ausgabe --- }
Function FileIO(cmd: Short; hdl: FileHandle; mem: Address): Boolean;
Begin
CASE cmd of
Cmd__Read : ok:=DOSRead(hdl,mem,1024);
Cmd__Write : ok:=DOSWrite(hdl,mem,1024);
END;
IF ok<>1024
then FileIO:=False
else FileIO:=True;
End;
{ --- File je nach Bedarf öffnen, zur Ein/Ausgabe --- }
Procedure OpenFile(Mode: Integer);
begin
GetParam(3,ArgStr);
If strlen(ArgStr)=0 then Cleanexit(" No filename",5);
handle:=DosOpen(ArgStr, Mode);
If handle=NIL then CleanExit(" Could not open IO-File\n",10);
end;
{
-------------------- MAIN -----------------------
}
BEGIN
write("
DxBoot 1.1a, (C)1992 by Diesel.
\n It`s Freeware!
\n\n");
ArgStr:=AllocString(100);
{ --- Kommando holen --- }
GetParam(1,ArgStr);
If strlen(ArgStr)=0 then CleanExit(" No Args",5);
{ --- nach a..z konvertieren --- }
for i:=0 to strlen(ArgStr)-1 do
ArgStr[i]:=tolower(ArgStr[i]);
{ --- Check, ob zulässiges Kommando --- }
comm:=Cmd__Null;
If strcmp(ArgStr,"read")=0 then comm:=Cmd__Read;
If strcmp(ArgStr,"write")=0 then comm:=Cmd__Write;
If strcmp(ArgStr,"chk")=0 then comm:=Cmd__Chk;
If strcmp(ArgStr,"boot")=0 then comm:=Cmd__Boot;
If strcmp(ArgStr,"cmp")=0 then comm:=Cmd__Cmp;
If strcmp(ArgStr,"type")=0 then comm:=Cmd__Type;
If strcmp(ArgStr,"kill")=0 then comm:=Cmd__Kill;
If strcmp(ArgStr,"?")=0 then comm:=Cmd__Help;
If comm=Cmd__Null then cleanexit(" Not valid command",5);
{ --- unit holen / df0..df3 = 0..3 --- }
If comm<>CMD__Help then begin
GetParam(2,ArgStr);
IF StrLen(ArgStr)=0 THEN CleanExit(" No Unit# [0..3]",5)
else begin
Case Byte(ArgStr^) of
48 : dfx := 0;
49 : dfx := 1;
50 : dfx := 2;
51 : dfx := 3;
Else
CleanExit(" Not valid unit number !",5);
End;
end;
End;
{ --- Ggf. File zum Schreiben/Lesen öffnen --- }
Case comm of
Cmd__Write,
Cmd__Cmp : OpenFile(Mode_OldFile);
Cmd__Read : OpenFile(Mode_NewFile);
End;
{ --- 1 K Chip-RAM reservieren : --- }
BB1:=BBPtr(AllocMem(1024,Memf_Chip));
If BB1=NIL then CleanExit(" Low on Chipmem !\n",10);
{ --- zus. 1 K RAM f. Vergleichs-BB o.ä. --- }
New(BB2);
{ --- Kommando ausführen : --- }
Case comm of
CMD__Read : { --- BB speichern --- }
begin
If not (RWBB(dfx, CMD__Read, BB1)) then Cleanexit(ErrorTD_IO,10);
If not (FileIO(CMD__Write, handle, BB1)) then CleanExit(DosErr_Wf, 10);
end;
CMD__Write : { --- install BB from file --- }
begin
If not (FileIO(CMD__Read, handle, BB1)) then CleanExit(DosErr_Rf ,10);
If not (RWBB(dfx, CMD__Write, BB1)) then Cleanexit(ErrorTD_IO,10);
end;
CMD__Chk : { --- check if 1.3-BB --- }
begin
Instant13BB(BB2);;
If not (RWBB(dfx, CMD__Read, BB1)) then Cleanexit(ErrorTD_IO,10);
For i:=0to 1023 do
If bb1^[i]<>bb2^[i] then CleanExit("
No 1.3-BB!!
\n",10);
CleanExit(" BB ok ( 1.3-BB)\n",0);
End;
CMD__Boot : { --- install original 1.3-BB --- }
begin
Instant13BB(BB1);
If not (RWBB(dfx, CMD__Write, BB1)) then Cleanexit(ErrorTD_IO,10);
End;
CMD__Cmp : { --- BB vergleichen --- }
begin
If not (RWBB(dfx, CMD__Read, BB1)) then Cleanexit(ErrorTD_IO,10);
If not (FileIO(CMD__Read, handle, BB2)) then CleanExit(DosErr_Rf, 10);
For i:=0 to 1023 Do
Begin
If BB1^[i]<>BB2^[i] then
begin
write(" BB -NOT- equal 2 file\n\n");
CleanExit(NIL,10);
end;
end;
write(" BB equal 2 file\n\n");
Cleanexit(NIL,0);
end;
CMD__Type : { --- HexDump(BB) --- }
begin
If not (RWBB(dfx, CMD__Read, BB1)) then Cleanexit(ErrorTD_IO,10);
DumpBB;
end;
CMD__Kill : { --- Install -> NDOS --- }
begin
For i:=0 to 1023 do
BB1^[i]:=0;
If not (RWBB(dfx, CMD__Write, BB1)) then Cleanexit(ErrorTD_IO,10);
end;
CMD__Help : { --- How 2 use it --- }
begin
write( "Usage : DxBoot cmd unit[0..3] <filename>\n",
"Available commands are:\n",
" read [unit#] BBfile 2 save a BootBlock\n",
" write [unit#] BBFile 2 install a BB\n",
" chk [unit#] 2 check if 1.3-BB\n",
" boot [unit#] 2 install a 1.3-BB\n",
" cmp [unit#] BBFile 2 cmp 2 a BB-file\n",
" type [unit#] 4 a hexdump\n",
" kill [unit#] 2 get a NDOS-Disk\n",
" ? [unit#] 4 help\n\n");
end;
END;
Cleanexit(NIL,0); { --- Bye !! --- }
END. { bye bye GTI ...}